import axios from 'axios'
import qs from 'qs'
import { getUserToken } from "@/utils/userLoginUtil"
import { createDiscreteApi } from "naive-ui"

const { message, loadingBar } = createDiscreteApi(
    ["message", "loadingBar"]
);

// 请求前配置
const request = async config => {
    // 加载条开始
    loadingBar.start()
    // 判断是否需要添加 userToken 请求头
    if (config.userPower) config.headers.userToken = await getUserToken();
    // 判断是否需要将 JSON 格式的数据转成 URL 参数
    if (config.dataParam) config.transformRequest = [data => qs.stringify(data)]
    // 返回最终的配置
    return config;
}

// 请求失败
const requestError = error => {
    // 加载条异常结束
    loadingBar.error()
    // 采用通知异常的消息
    message.error("发送" + error.config.name + "请求失败")
    // 返回发送请求失败的原因
    return Promise.reject(error);
}

// 响应
const requestResponse = (response) => {
    // 加载条结束
    loadingBar.finish()
    // 得到响应的服务器中的数据
    const responseData = response.data
    // 打印服务器返回的数据
    console.log(responseData)
    // 判断是否请求成功
    if (responseData.success) {
        // 判断请求成功是否采用消息通知
        if (response.config.successMessage) message.success(responseData.message)
        // 返回服务器返回的数据
        return responseData
    }
    // 消息通知失败的原因
    message.error(responseData.message)
    // 判断是否登录失效的原因
    if (response.data.code === "R_002") loginInvalid()
    // 返回空数据
    return null
}

// -----------------------------------------------------------

// 请求对象
const noteServeRequest = axios.create({ baseURL: '/note-serve' })

// 添加请求拦截器
noteServeRequest.interceptors.request.use(config => request(config), error => requestError(error));

// 添加响应拦截器
noteServeRequest.interceptors.response.use(response => requestResponse(response), error => requestError(error))

// 导出请求对象
export default noteServeRequest